﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LarDosIdosos.Business.Model;
using LarDosIdosos.NewAcessaDados;
using MySql.Data.MySqlClient;

namespace LarDosIdosos.Business
{
    public class DBDoacao
    {
        private string _stringConnection;

        public DBDoacao(string stringDeConexaoComBanco)
        {
            _stringConnection = stringDeConexaoComBanco;
        }

        /// <summary>
        /// Busca uma lista pela query recebida
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public List<Doacao> SelectList(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                if (reader.HasRows)
                {
                    return MontaListaDeDoacao(reader);
                }
                return new List<Doacao>();
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        /// <summary>
        /// Monta uma lista pelo reader recebido
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private List<Doacao> MontaListaDeDoacao(MySqlDataReader reader)
        {
            List<Doacao> listDoacao = new List<Doacao>();
            while (reader.Read())
            {
                listDoacao.Add(MontaDoacao(reader));
            }
            return listDoacao;
        }

        /// <summary>
        /// Monta uma doação pelo reader recebido
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private Doacao MontaDoacao(MySqlDataReader reader)
        {
            Doacao doacao = new Doacao();
            doacao.Codigo_Entrada = Convert.ToInt32(reader["Codigo_Entrada"]);
            doacao.Quantidade = Convert.ToDouble(reader["quantidade_entrada"]);
            doacao.Data_Entrada = Convert.ToDateTime(reader["data_entrada"]);
            doacao.Is_Doacao = Convert.ToBoolean(reader["Is_doacao"]);
            doacao.Parceiro = ObtemParceiro(reader["Parceiro_Codigo_Parceiro"].ToString());
            doacao.Idoso = ObtemIdoso(reader["idoso_codigo_idoso"].ToString());
            doacao.FuncionarioEntradaProduto = ObtemFuncionario(Convert.ToInt32(reader["funcionario_codigo_funcionario"]));
            
            doacao.Produto.Codigo_Produto = Convert.ToInt32(reader["codigo_produto"]);
            doacao.Produto.Nome_Produto = reader["nome_produto"].ToString();
            doacao.Produto.Tipo_Produto.Codigo_Tipo_Produto = Convert.ToInt32(reader["codigo_tipo_produto"]);
            doacao.Produto.Tipo_Produto.Nome_Tipo_Produto = reader["Nome_tipo_produto"].ToString();
            doacao.Produto.Unidade_De_Medida.Codigo_Unidade_De_Medida = Convert.ToInt32(reader["codigo_unidade_de_medida"]);
            doacao.Produto.Unidade_De_Medida.Nome_Unidade_De_Medida = reader["Nome_Unidade_De_Medida"].ToString();
            doacao.Produto.Unidade_De_Medida.Sigla_Unidade_De_Medida = reader["Sigla_Unidade_De_Medida"].ToString();
            return doacao;
        }

        /// <summary>
        /// Busca um funcionário pelo código recebido
        /// </summary>
        /// <param name="codigo_funcionario"></param>
        /// <returns></returns>
        private Funcionario ObtemFuncionario(int codigo_funcionario)
        {
            DBFuncionarios dbFuncionarios = new DBFuncionarios(_stringConnection);
            return dbFuncionarios.BuscaFuncionario(codigo_funcionario);
        }

        /// <summary>
        /// Obtem um idoso pelo código recebido
        /// </summary>
        /// <param name="codigo_idoso"></param>
        /// <returns></returns>
        private Idoso ObtemIdoso(string codigo_idoso)
        {
            if (string.IsNullOrEmpty(codigo_idoso))
            {
                return new Idoso();
            }
            DBIdosos dbIdosos = new DBIdosos(_stringConnection);

            return dbIdosos.SelectIdoso("select * from idoso where codigo_idoso = " + codigo_idoso);
        }

        /// <summary>
        /// Obtem um parceiro pelo codigo recebido
        /// </summary>
        /// <param name="codigo_parceiro"></param>
        /// <returns></returns>
        private Parceiro ObtemParceiro(string codigo_parceiro)
        {
            if(string.IsNullOrEmpty(codigo_parceiro))
            {
                return new Parceiro{ Nome_Parceiro = "Anônimo"};
            }
            DBParceiro dbParceiro = new DBParceiro(_stringConnection);
            return dbParceiro.BuscaParceiro(Convert.ToInt32(codigo_parceiro));
        }

        /// <summary>
        /// Baita de um gato para contar os registros encontrados pela query... miauuuu
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Count(string sql)
        {
            var conn = new AcessaDados(_stringConnection);
            try
            {
                int i = 0;
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                while (reader.Read())
                {
                    i++;
                }
                return i;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        /// <summary>
        /// Busca uma doação pela query recebida
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public Doacao Select(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                var reader = conn.ExecuteDataReader(sql);
                if (reader.Read())
                {
                    return MontaDoacao(reader);
                }
                return null;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível consultar o tipo documento", ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }

        /// <summary>
        /// Atualiza um registro pela query recebida
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Update(string sql)
        {
            AcessaDados conn = new AcessaDados(_stringConnection);
            try
            {
                conn.OpenConnection();
                int updated = conn.ExecuteNonQuery(sql);
                return updated;
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível executar a query: " + sql, ex);
            }
            finally
            {
                conn.CloseConection();
            }
        }
    }
}
